/**
 * @file acwing/271/main.cpp
 * @see https://www.acwing.com/problem/content/273/
 * @author Ruiming Guo (guoruiming@stu.scu.edu.cn)
 * @brief 有 N 个学生合影，站成左对齐的 k 排，每排有 N_1, N_2, ..., N_k 个人
 * 学生的身高互不相同，从高到低标记为1, 2, ... N，也就是 1 号最高 N 号最低
 *
 * 合影时要求每一排身高从左到右递减，每一列从左到右递减，
 *
 * 问：有多少种安排合影位置的方案？
 *
 * 从高到低依次安排每个同学的位置，
 * 那么在安排过程中，当前同学一定占据每排最靠左的连续若干个位置，
 * 且从后往前每排人数单调递减。
 * 否则一定不满足“每排从左到右身高递减，从后到前身高也递减”这个要求。
 *
 * 状态：f[a][b][c][d][e] 表示从后往前每排人数分别为 a, b, c, d, e 的所有方案数
 *
 * 状态计算对应集合的划分，令最后一个同学被安排在哪一排作为划分依据，可以将f[a][b][c][d][e]划分成5个不重不漏的子集：
 * 当a > 0 && a - 1 >= b时，最后一个同学可能被安排在第1排，
 * 方案数是f[a-1][b][c][d][e]；
 * 当b > 0 && b - 1 >= c时，最后一个同学可能被安排在第2排，
 * 方案数是f[a][b - 1][c][d][e]；
 * 当c > 0 && c- 1 >= d时，最后一个同学可能被安排在第3排，
 * 方案数是f[a][b][c - 1][d][e]；
 * 当d >0 && d - 1 >= e时，最后一个同学可能被安排在第4排，
 * 方案数是f[a][b][c][d - 1][e]；
 * 当e > 0时，最后一个同学可能被安排在第5排，
 * 方案数是f[a][b][c][d][e - 1]；
 *
 * @version 1.0
 * @date 2022-05-06
 *
 * 时间复杂度：O(k*(N/k)^k)
 * 空间复杂度：O(\prod_{i=1}^k{s})
 *
 * @copyright Copyright (c) 2022
 *
 **/

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 31;
int n;
ll f[N][N][N][N][N];
int main() {
  while (cin >> n, n) {
    int s[5] = {0};
    for (int i = 0; i < n; ++i) cin >> s[i];  // 输入第 i 排站几个人
    memset(f, 0, sizeof(f));
    f[0][0][0][0][0] = 1;

    // 从最高到最低安排学生
    for (int a = 0; a <= s[0]; ++a) {
      for (int b = 0;
           b <= min(a, s[1]);  // min 因为前一排人数**一定**不能比后一排多
           ++b) {
        for (int c = 0; c <= min(b, s[2]); ++c) {
          for (int d = 0; d <= min(c, s[3]); ++d) {
            for (int e = 0; e <= min(d, s[4]); ++e) {
              // 对每一个学生
              ll &x = f[a][b][c][d][e];
              if (a) x += f[a - 1][b][c][d][e];
              if (b) x += f[a][b - 1][c][d][e];
              if (c) x += f[a][b][c - 1][d][e];
              if (d) x += f[a][b][c][d - 1][e];
              if (e) x += f[a][b][c][d][e - 1];
            }
          }
        }
      }
    }
    cout << f[s[0]][s[1]][s[2]][s[3]][s[4]] << endl;
  }
}
